package core;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import db.DBConnection;

public class UtilityFunctions
{
	public UtilityFunctions()
	{
		
	}
	
	/**
	 * Questa funzione arrotonda i decimali alla seconda cifra.
	 * @param numero
	 * @return un double arrotondato
	 */
	public double arrotondaDecimali(double numero, int nCifreDecimali)
	{
		return Math.round( numero * Math.pow( 10, nCifreDecimali ) )/Math.pow( 10, nCifreDecimali );
	}
	
	/**
	 * Funzione che interroga il db data una query sotto forma di stringa
	 * @param query
	 * @return null se qualcosa va storto, il resultset se va tutto a buon fine
	 */
	public ResultSet executeQuery(DBConnection con, String query)
	{
		Statement st;
		ResultSet res = null;
		try {
			st = con.getCon().createStatement();
			res = st.executeQuery(query);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			//VA previsto un messaggio di errore
			return null;
		} 
		return res;
	}
	
	public ResultSet executeParametricQuerySingleParameter(DBConnection con, String query, String parameter)
	{
		PreparedStatement pst;
		ResultSet res = null;
		try {
			pst = con.getCon().prepareStatement(query);
			pst.setString(1, parameter);
			res = pst.executeQuery();
		}catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
			return res;
		}
		return res;
	}
	
	public ResultSet executeParametricQuery(DBConnection con, String query, String[] parameters)
	{
		PreparedStatement pst;
		ResultSet res = null;
		try {
			pst = con.getCon().prepareStatement(query);
			for(int i=0; i<parameters.length; i++)
			{
				System.out.println("parametro " + parameters[i]);
				System.out.println("lungh param " + parameters.length);
				pst.setString(i+1, parameters[i]);
			}
			res = pst.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return res;
		}
		return res;
	}
	
	public void executeUpdate(DBConnection con, String query) throws SQLException {
		Statement st;
		st = con.getCon().createStatement();
		st.executeUpdate(query);
	}
	
	/**
	 * Metodo che esegue un aggiornamento parametrico data una query sottoforma di stringa e una 
	 * serie di parametri dato come un array di stringhe
	 * @param con
	 * @param query
	 * @param parameters
	 */
	public void executeParametricUpdate(DBConnection con, String query, String [] parameters) throws SQLException
	{
		PreparedStatement pst;
		try {
			pst = con.getCon().prepareStatement(query);
			for(int i=0; i<parameters.length; i++)
			{
				pst.setString(i+1, parameters[i]);
			}
			pst.execute();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public void executeParametricUpdateSingleParameter(DBConnection con, String query, String parameter) throws SQLException
	{
		PreparedStatement pst;
		pst = con.getCon().prepareStatement(query);
		pst.setString(1, parameter);
		pst.execute();
	}
}